from typing import Optional
from pydantic import BaseModel, EmailStr

class UserBase(BaseModel):
    """用户基础模型
    
    包含用户的基本信息字段，作为其他用户相关模型的基类
    """
    email: Optional[EmailStr] = None  # 用户邮箱，使用EmailStr类型确保格式正确
    username: Optional[str] = None  # 用户名
    is_active: Optional[bool] = True  # 用户是否激活，默认为激活状态
    is_superuser: bool = False  # 是否为超级管理员，默认为普通用户
    full_name: Optional[str] = None  # 用户全名

class UserCreate(UserBase):
    """用户创建模型
    
    用于创建新用户时的数据验证，继承自UserBase并添加必要字段
    """
    email: EmailStr  # 创建用户时邮箱必填
    username: str  # 创建用户时用户名必填
    password: str  # 创建用户时密码必填

class UserUpdate(UserBase):
    """用户更新模型
    
    用于更新用户信息时的数据验证，所有字段都是可选的
    """
    password: Optional[str] = None  # 更新密码，可选字段

class UserInDBBase(UserBase):
    """数据库用户基础模型
    
    表示数据库中用户对象的基础模型，包含数据库特有字段
    """
    id: Optional[int] = None  # 用户ID，数据库主键

    class Config:
        """Pydantic配置类
        
        控制模型行为
        """
        from_attributes = True  # 允许从ORM模型创建Pydantic模型

class User(UserInDBBase):
    """用户响应模型
    
    用于API响应中返回给客户端的用户信息，不包含敏感信息
    """
    pass

class UserInDB(UserInDBBase):
    """数据库完整用户模型
    
    包含完整的用户数据库信息，包括哈希密码
    """
    hashed_password: str  # 哈希后的密码，仅在内部使用